═══════════════════════════════════════════
  Nexara Client v2.3 — REBUILT EDITION
  Hub routing: Static IP only (no mDNS)
═══════════════════════════════════════════

SETUP
─────
1. Install dependencies:
   pip install flask requests beautifulsoup4 reportlab bcrypt

2. Run:   python app.py
3. Open:  http://localhost:5001
4. Activate with the key your admin gave you

CONNECTING TO THE HUB (IT MACHINE)
────────────────────────────────────
TWO WAYS to set the hub IP:

Option A — Built into your license key (recommended):
  The admin generates your key with the hub IP already inside.
  Just activate and you're automatically a worker.

Option B — Set it manually from the dashboard:
  If your key has no hub IP, a banner appears at the top of the
  dashboard with an input field. Type the IT machine's IP
  (e.g. 192.168.1.13) and click Connect. That's it.
  The setting is saved — it persists across restarts.

WHAT WORKERS DO
────────────────
- Threat reports from the Nexara extension → saved locally + forwarded to hub
- Training completions → saved locally + forwarded to hub
- If hub is temporarily offline, data queues locally and retries every 30s
- Workers see their own data in their local dashboard
- IT (hub) sees everything from all workers combined

NO MORE mDNS / AUTO-DISCOVERY
───────────────────────────────
This version uses static IP only. No zeroconf, no background scanning.
If it can't reach the hub it will queue data and retry — no silent failures.

TROUBLESHOOTING
────────────────
- Worker can't reach hub? Check both machines show 192.168.X.X (same subnet)
- Run on hub machine: netsh advfirewall firewall add rule name="Nexara" dir=in action=allow protocol=TCP localport=5001
- Ping the hub IP from the worker — if it replies, the app will connect
